import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class GameWorld extends World {
    private List<Pic> pics = new ArrayList<>();  // 图片对象列表
    private Pic lastPic;  // 最后一个图片
    private boolean gameRunning;  // 游戏状态标识

    public static final int CONGYU = 0;
    public static final int FANGNAI = 1; 
    public static final int MOZI = 2; 
    public static final int CIALLO = 3;
    public int name;
    private GameStats gameStats = new GameStats();
    private MusicPlayer musicPlayer; // 音乐播放器引用
    private boolean soundPlayed = false; // 追踪音效是否已播放
    
    public GameWorld(int name, int height, int weight,MusicPlayer musicPlayer) {    
        super(height, weight, 112);  
        this.name = name; // 保存传入的name值
        addObject(gameStats, 50, 20); // 在左上角添加统计类
        setActOrder(GameStats.class); // 确保 GameStats 在最上层
        
        String folderPath = getFolderPath(name);
        initializePics(folderPath, name);
        lastPic = createLastPic(folderPath, name); // 创建最后一个图片对象
        gameRunning = false;
        
        this.musicPlayer = musicPlayer; // 传递的音乐播放器
    
        // 设置背景颜色为黑色，只有在CIALLO模式下
        if (name == CIALLO) {
            GreenfootImage background = new GreenfootImage(getWidth(), getHeight());
            background.setColor(Color.BLACK); // 设置颜色为黑色
            background.fill(); // 填充背景
            setBackground(background); // 设置为当前背景
        }
    }

    // 根据名称获取文件夹路径
    private String getFolderPath(int name) {
        switch (name) {
            case CONGYU: return "congyu/";
            case FANGNAI: return "fangnai/";
            case MOZI: return "mozi/";
            case CIALLO: return "ciallo/";
            default: return "default/";  // 默认文件夹
        }
    }

    // 初始化图片对象
    private void initializePics(String folderPath, int name) {
        if (name == CIALLO) {
            for (int i = 0; i < 24; i++) { // CIALLO模式下使用25张图片
                Pic pic = new Pic(folderPath, i, 0);
                pics.add(pic);
                addObject(pic, i % 5, i / 5);
            }
        } else {
            for (int i = 0; i < 8; i++) {
                Pic pic = new Pic(folderPath, i, 0);
                pics.add(pic);
                addObject(pic, i % 3, i / 3);
            }
        }
    }

    // 创建最后一张图片对象
    private Pic createLastPic(String folderPath, int name) {
        if (name == CIALLO) {
            Pic pic = new Pic(folderPath, 24, 0); // CIALLO 使用第25张图片
            addObject(pic, 4, 4); // 最后一个图片位置
            return pic;
        }
        Pic pic = new Pic(folderPath, 8, 0);
        addObject(pic, 2, 2);
        return pic;
    }

    // 重置图片，打乱图片的显示顺序
    private void resetPics() {
        removePicsFromWorld();
        addObject(gameStats, 50, 20); // 在打乱后重新添加 GameStats
        Collections.shuffle(pics); // 随机打乱图片列表中的图片位置
        addShuffledPicsToWorld();   // 将打乱后图片重新加入游戏场景
        gameRunning = true; // 游戏状态设为运行
    }

    // 从游戏场景中移除所有图片
    private void removePicsFromWorld() {
        for (Pic pic : pics) {
            removeObject(pic);
            Greenfoot.delay(30);
        }
        removeObject(lastPic);
        Greenfoot.delay(30);
    }

    // 将打乱后的图片加入游戏场景
    private void addShuffledPicsToWorld() {
        for (int i = 0; i < pics.size(); i++) {
            pics.get(i).setRandomRotation(); // 设置随机角度
            addObject(pics.get(i), i % (pics.size() > 8 ? 5 : 3), i / (pics.size() > 8 ? 5 : 3)); // 根据图片数量调整列数
        }
    }
    
    // 更新游戏世界的运行逻辑
    public void act() {
        setActOrder(GameStats.class);
        if (!gameRunning) {
            resetPics();
        }
        gameStats.setLocation(50, 20); // 始终在左上角显示
        if (checkIfPuzzleCompleted()) {
            addObject(lastPic, 2, 2);  // 加入最后一张图片
            musicPlayer.stopMusic(); // 停止播放音乐
            // 只播放一次音效
            if (!soundPlayed) {
                Greenfoot.playSound("win.wav"); // 播放完成的音效
                soundPlayed = true; // 标记音效已播放
            }
            
            // 创建并添加返回按钮
            BackButton backButton = new BackButton("Continue.jpg"); // 替换为你的按钮图片文件
            addObject(backButton, getWidth() / 2, getHeight() - 50); // 将按钮放置在屏幕底部中间
            
        }
    }

    // 检查拼图是否完成
    private boolean checkIfPuzzleCompleted() {
        for (int i = 0; i < (name == CIALLO ? 24 : 8); i++) { // 根据拼图类型调整检查逻辑
            List<Pic> pictures = getObjectsAt(i % (name == CIALLO ? 5 : 3), i / (name == CIALLO ? 5 : 3), Pic.class);
            if (pictures.isEmpty() || pictures.get(0).getValue() != i || pictures.get(0).getRotation() != 0) {
                return false; // 拼图未完成
            }
        }
        return true; // 拼图完成
    }
    public int getName() {
        return name;
    }
    public GameStats getGameStats() {
        return gameStats; // 确保返回正确的 gameStats 实例
    }
}
